package org.jeecg.modules.complain.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.*;
import org.jeecg.modules.complain.entity.Complain;
import org.jeecg.modules.complain.entity.ComplainStatus;
import org.jeecg.modules.complain.entity.ComplaintConfig;
import org.jeecg.modules.complain.service.IComplainService;
import org.jeecg.modules.complain.service.IComplainStatusService;
import org.jeecg.modules.complain.service.IComplaintConfigService;
import org.jeecg.modules.system.service.ISysUserPositionService;
import org.jeecg.modules.system.service.ISysUserRoleService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;

/**
 * @Description: 投诉管理
 * @Author: jeecg-boot
 * @Date:   2019-08-30
 * @Version: V1.0
 */
@Slf4j
@Api(tags="投诉管理")
@RestController
@RequestMapping("/b/complain/complainList")
public class ComplainController {

	@Autowired
	private IComplainService complainService;
	@Autowired
    private IComplaintConfigService complaintConfigService;
	@Autowired
    private IComplainStatusService complainStatusService;
	@Autowired
	private ISysUserPositionService sysUserPositionService;
	@Autowired
	private ISysUserRoleService sysUserRoleService;

	private static long no = 0;
	
	/**
	  * 分页列表查询
	 * @param complain
	 * @param pageNo
	 * @param pageSize
	 * @param req
	 * @return
	 */
	@AutoLog(value = "投诉管理-分页列表查询")
	@ApiOperation(value="投诉管理-分页列表查询", notes="投诉管理-分页列表查询")
	@GetMapping(value = "/list")
	public Result<IPage<Complain>> queryPageList(Complain complain,
									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
									  HttpServletRequest req) {
		Result<IPage<Complain>> result = new Result<IPage<Complain>>();
		List<String> projectIds = sysUserRoleService.queryProjectIds(complain);
		complain.resetValue();
		QueryWrapper<Complain> queryWrapper = QueryGenerator.initQueryWrapper(complain, req.getParameterMap());
		queryWrapper.eq("del_flag","0");
		if (projectIds.size() <=0){
			queryWrapper.eq("project_id","");
		}else{
			queryWrapper.in("project_id",projectIds);
		}
		 Page<Complain> page = new Page<Complain>(pageNo, pageSize);
		IPage<Complain> pageList = complainService.page(page, queryWrapper);
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}
	/**
	  *   添加
	 * @param complain
	 * @return
	 */
	@AutoLog(value = "投诉管理-添加")
	@ApiOperation(value="投诉管理-添加", notes="投诉管理-添加")
	@PostMapping(value = "/add")
	public Result<Complain> add(@RequestBody Complain complain) {
		Result<Complain> result = new Result<Complain>();
        ComplainStatus complainStatus = new ComplainStatus();
		String departId = complaintConfigService.getDepartIdByProject(complain.getProjectId());
		complain.setSource(0);
		//查询该管理处是否拥有投诉配置
		ComplaintConfig complaintConfig = complaintConfigService.selectByDepartId(departId);
        if (complaintConfig == null){
            return  Result.error("该管理处没有开通此项权限,请联系管理员");
        }
        try {
			//投诉单号
		  String cno = DateUtils.getDate("yyyyMMddHHmmss") + String.format("%05d", no++);
		  if (no > 99999){
		 	 no =0;
			}
			complain.setComplainNo(cno);
			complain.setReturnDate(new Date());
            LoginUser loginUser = SsoUtil.getLoginUser();
            String realname = loginUser.getRealname();
            complain.setCreateBy(realname);
			complain.setStatus(CommonDefine.COMPLAIN_STATUS_100);
			complainService.save(complain);
			//拿到该条投诉单的id
            String id = complain.getId();
            complainStatus.setComplainId(id);
            complainStatus.setCreateBy(realname);
            complainStatus.setStatus(CommonDefine.COMPLAIN_STATUS_100);
            complainStatusService.save(complainStatus);
            result.success("添加成功!");
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			result.error500("操作失败");
		}
		return result;
	}
	
	/**
	  *  编辑
	 * @param complain
	 * @return
	 */
	@AutoLog(value = "投诉管理-编辑")
	@ApiOperation(value="投诉管理-编辑", notes="投诉管理-编辑")
	@PutMapping(value = "/edit")
	public Result<Complain> edit(@RequestBody Complain complain) {
		Result<Complain> result = new Result<Complain>();
		Complain complainEntity = complainService.getById(complain.getId());
		if(complainEntity==null) {
			result.error500("未找到对应实体");
		}else {
			boolean ok = complainService.updateById(complain);
			//TODO 返回false说明什么？
			if(ok) {
				result.success("修改成功!");
			}
		}
		
		return result;
	}
	
	/**
	  *   通过id删除
	 * @param id
	 * @return
	 */
	@AutoLog(value = "投诉管理-通过id删除")
	@ApiOperation(value="投诉管理-通过id删除", notes="投诉管理-通过id删除")
	@DeleteMapping(value = "/delete")
	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
		try {
			complainService.removeById(id);
		} catch (Exception e) {
			log.error("删除失败",e.getMessage());
			return Result.error("删除失败!");
		}
		return Result.ok("删除成功!");
	}
	
	/**
	  *  批量删除
	 * @param ids
	 * @return
	 */
	@AutoLog(value = "投诉管理-批量删除")
	@ApiOperation(value="投诉管理-批量删除", notes="投诉管理-批量删除")
	@DeleteMapping(value = "/deleteBatch")
	public Result<Complain> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
		Result<Complain> result = new Result<Complain>();
		if(ids==null || "".equals(ids.trim())) {
			result.error500("参数不识别！");
		}else {
			this.complainService.removeByIds(Arrays.asList(ids.split(",")));
			result.success("删除成功!");
		}
		return result;
	}
	
	/**
	  * 通过id查询
	 * @param id
	 * @return
	 */
	@AutoLog(value = "投诉管理-通过id查询")
	@ApiOperation(value="投诉管理-通过id查询", notes="投诉管理-通过id查询")
	@GetMapping(value = "/queryById")
	public Result<Complain> queryById(@RequestParam(name="id",required=true) String id) {
		Result<Complain> result = new Result<Complain>();
		Complain complain = complainService.getById(id);
		if(complain==null) {
			result.error500("未找到对应实体");
		}else {
			result.setResult(complain);
			result.setSuccess(true);
		}
		return result;
	}

  /**
      * 导出excel
   *
   * @param request
   * @param response
   */
  @RequestMapping(value = "/exportXls")
  public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
      // Step.1 组装查询条件
      QueryWrapper<Complain> queryWrapper = null;
      try {
          String paramsStr = request.getParameter("paramsStr");
          if (oConvertUtils.isNotEmpty(paramsStr)) {
              String deString = URLDecoder.decode(paramsStr, "UTF-8");
              Complain complain = JSON.parseObject(deString, Complain.class);
              queryWrapper = QueryGenerator.initQueryWrapper(complain, request.getParameterMap());
          }
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      }
      //Step.2 AutoPoi 导出Excel
      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
      List<Complain> pageList = complainService.list(queryWrapper);
      //导出文件名称
      mv.addObject(NormalExcelConstants.FILE_NAME, "投诉管理列表");
      mv.addObject(NormalExcelConstants.CLASS, Complain.class);
      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("投诉管理列表数据", "导出人:Jeecg", "导出信息"));
      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
      return mv;
  }

  /**
      * 通过excel导入数据
   *
   * @param request
   * @param response
   * @return
   */
  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
          MultipartFile file = entity.getValue();// 获取上传文件对象
          ImportParams params = new ImportParams();
          params.setTitleRows(2);
          params.setHeadRows(1);
          params.setNeedSave(true);
          try {
              List<Complain> listComplains = ExcelImportUtil.importExcel(file.getInputStream(), Complain.class, params);
              complainService.saveBatch(listComplains);
              return Result.ok("文件导入成功！数据行数:" + listComplains.size());
          } catch (Exception e) {
              log.error(e.getMessage(),e);
              return Result.error("文件导入失败:"+e.getMessage());
          } finally {
              try {
                  file.getInputStream().close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      return Result.ok("文件导入失败！");
  }

	 /**
	  * 投诉受理
	  * @Param : handId  投诉单 complainId
	  */
	 @RequestMapping("dealComplainId")
	 public Result<?> dealComplainId(@RequestParam(name = "complainId")String complainId,
									 @RequestParam(name = "returnContents")String returnContents,
									 @RequestParam(name = "status")Integer status){
	 	 Result<Object> result = new Result<>();
		 if (StringUtils.isEmpty(complainId)){
		 	return Result.error("请选择具体的投诉单操作");
		 }
		 Complain complain = complainService.getById(complainId);
		 Integer source = complain.getSource();
		 ComplainStatus complainStatus = complainStatusService.selectStatus(complainId,status);
		 if (complainStatus == null){
	     	return Result.error("该投诉单不存在");
	     }
		 LoginUser loginUser = SsoUtil.getLoginUser();
		 //状态改为已处理待评论
		 complainStatus.setStatus(status);
		 //逻辑删除添加完成状态
         complainStatus.setCreateBy(loginUser.getRealname());
		 complainStatus.setCreateTime(new Date());
		 complainStatus.setPicture(null);
		 complainStatus.setHandId(loginUser.getId());
		 complainStatus.setHandrealname(loginUser.getRealname());
		 complainStatus.setReturnContents(returnContents);
		 Integer integer = complainStatusService.deletStatus(complainStatus,source);
		 if (integer > 0){
			 Integer flag = complainService.updateStatus(complainStatus);
			 if (flag > 0){
			 	result.setMessage("处理成功");
			 }else{
			 	result.setMessage("处理失败");
			 }
		 }
	        return result;
	 }

	 /**
	  * 投诉单详情
	  * @Param complainId
	  */
	 @RequestMapping("complainIdDetail")
	 public Result<Object> complainIdDetail(@RequestParam(name = "complainId")String complainId){
		 Result<Object> result = new Result<>();
		 Complain complain = complainService.getById(complainId);
		 List<ComplainStatus> complainStatuses = complainStatusService.selectAll(complainId);
		 for (ComplainStatus com:complainStatuses) {
		 	String picture = com.getPicture();
		 	if (StringUtils.isNotEmpty(picture)){
				String[] commentPicture = picture.split(";");
				com.setCommentPicture(commentPicture);
			}
		 }
		 HashMap<String, Object> hashMap = new HashMap<>();
	     hashMap.put("complain",complain);
	     hashMap.put("complainStatuses",complainStatuses);
	     result.setResult(hashMap);
	     return result;
	 }
	/**
	 * 投诉单取消
	 * @Param complainId
	 */
	@RequestMapping("cancleComplanit")
	public Result<?> cancleComplanit(@RequestParam("complainId") String complainId,
	                                  @RequestParam("contents")String contents){
		Result<Object> result = new Result<>();
		ComplainStatus complainStatus = new ComplainStatus();
		complainStatus.setStatus(CommonDefine.COMPLAIN_STATUS_400);
		complainStatus.setComplainId(complainId);
		if (StringUtils.isEmpty(contents)){
			return Result.error("请填写取消原因");
		}
		if (StringUtils.isEmpty(complainId)){
			return Result.error("请选择具体的报修单");
		}
		try{
			complainStatusService.deletStatus(complainStatus,null);
			complainService.updateStatus(complainStatus);
			result.setMessage("取消成功");
		 }catch (Exception e){
			log.error("操作错误");
			e.printStackTrace();
		}
	       return result;
	 }

}
